package com.zenithmind.note.service;

import com.zenithmind.note.pojo.dto.NoteDTO;
import com.zenithmind.note.pojo.entity.Note;
import com.zenithmind.note.pojo.vo.NoteVO;

import java.util.List;

/**
 * 笔记命令服务接口
 * 遵循单一职责原则：只负责笔记的增删改操作
 * 遵循接口隔离原则：将命令操作从主服务中分离
 * 
 * @author ZenithMind
 * @since 2024-01-01
 */
public interface NoteCommandService {
    
    /**
     * 创建笔记
     * 
     * @param noteDTO 笔记数据
     * @param userId 用户ID
     * @return 创建的笔记
     */
    Note createNote(NoteDTO noteDTO, String userId);
    
    /**
     * 更新笔记
     * 
     * @param noteDTO 笔记数据
     * @param userId 用户ID
     */
    void updateNote(NoteDTO noteDTO, String userId);
    
    /**
     * 删除笔记
     * 
     * @param id 笔记ID
     * @param userId 用户ID
     */
    void deleteNote(String id, String userId);
    
    /**
     * 批量删除笔记
     * 
     * @param ids 笔记ID列表
     * @param userId 用户ID
     */
    void deleteBatch(List<String> ids, String userId);
    
    /**
     * 发布笔记
     * 
     * @param id 笔记ID
     * @param userId 用户ID
     */
    void publishNote(String id, String userId);
    
    /**
     * 撤回笔记到草稿状态
     * 
     * @param id 笔记ID
     * @param userId 用户ID
     */
    void revertToDraft(String id, String userId);
    
    /**
     * 更新笔记状态
     * 
     * @param id 笔记ID
     * @param status 状态
     * @param userId 用户ID
     */
    void updateStatus(String id, Integer status, String userId);
    
    /**
     * 批量更新笔记状态
     * 
     * @param ids 笔记ID列表
     * @param status 状态
     * @param userId 用户ID
     */
    void batchUpdateStatus(List<String> ids, Integer status, String userId);
    
    /**
     * 管理员添加或修改笔记
     * 
     * @param note 笔记信息
     * @return 笔记VO
     */
    NoteVO addOrUpdateNoteByAdmin(Note note);
    
    /**
     * 设置笔记标签
     * 
     * @param noteId 笔记ID
     * @param tagIds 标签ID列表
     * @param userId 用户ID
     */
    void setNoteTags(String noteId, List<String> tagIds, String userId);
    
    /**
     * 添加笔记标签
     * 
     * @param noteId 笔记ID
     * @param tagId 标签ID
     * @param userId 用户ID
     */
    void addNoteTag(String noteId, String tagId, String userId);
    
    /**
     * 移除笔记标签
     * 
     * @param noteId 笔记ID
     * @param tagId 标签ID
     * @param userId 用户ID
     */
    void removeNoteTag(String noteId, String tagId, String userId);
}
